#coding:utf-8
from rest_framework.decorators import action
from rest_framework.views import APIView
from rest_framework import viewsets, status
from rest_framework.response import Response
import logging

from MSB_ERP.apps.erp_system.serializer.role_serializer import RolesPartialSerializer,RoleSetPermissionSerializer,BaseRolesSerializer
from MSB_ERP.utils.base_views import MultipleDestroyMixin
from rest_framework.permissions import IsAuthenticated
from erp_system.models import RolesModel, PermissionsModel,MenuModel
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
#角色数据库中有一个固定的角色，admin，这个角色代表所有的权限，它不能删除
class RolesView(viewsets.ModelViewSet,MultipleDestroyMixin):
    """
    create:
    角色--新增

    角色新增, status: 201(成功), return: 新增角色信息

    destroy:
    角色--删除

    角色删除, status: 204(成功), return: None

    multiple_delete:
    角色--批量删除

    角色批量删除, status: 204(成功), return: None

    update:
    角色--修改,只是修改角色名字。

    角色修改, status: 200(成功), return: 修改后的角色信息

    partial_update:
    角色--局部修改(角色批量授权),只能真的某一个角色一次性授权，之前的的授权会被覆盖

    角色批量授权, status: 200(成功), return: 修改后的角色信息

    set_permission_to_role:
    角色--单个授权，一次只能授予角色一个permission，也可以取消一个permission，给单个角色，单一授权。一次只能授予角色一个权限,也可以取消一个权限
    status: 200(成功), return: 修改后的角色信息

    list:
    角色--获取列表

    角色列表信息, status: 200(成功), return: 角色信息列表



    """

    # 加入用户登录认证的装饰器
    # permission_classes =[IsAuthenticated]
    queryset = RolesModel.objects.all()

    def get_serializer_class(self):
        if self.action == 'partial_update': #如/roles/partial_update/
            return RolesPartialSerializer

        elif self.action=='set_permission_to_role':
            return RoleSetPermissionSerializer

        else:
            return BaseRolesSerializer

    @action(methods=['post'],detail=False)
    def set_permission_to_role(self,request,*args,**kwargs):
        ser=RoleSetPermissionSerializer(data=request.data)
        if ser.is_valid(): #参数验证
            #查询当前的角色
            role=RolesModel.objects.get(id=ser.validated_data.get('role_id'))
            #查询当前的权限
            permission=PermissionsModel.objects.get(id=ser.validated_data.get('permission_id'))

            if ser.validated_data.get('is_create'):
                   #判断该权限所对应的父菜单权限是否被授予
                   #第一步得到该权限的对应的接口菜单的父菜单
                parent_ids=MenuModel.objects.filter(id=permission.menu.id).values_list('parent__id',flat=True).all()
                if parent_ids:
                    parent_permission=PermissionsModel.objects.get(menu_id=parent_ids[0])
                    role.permissions.add(parent_permission)#把父菜单的权限也加进去
                role.permissions.add(permission)#把当前的权限授予当前的角色
            else: #取消授权
                role.permissions.remove(permission)

            result_ser=BaseRolesSerializer(instance=role)
            return Response(data=result_ser.data)

    def destroy(self, request, *args, **kwargs):
        if self.get_object().name == 'admin':
            return Response(data={'detail': 'admin角色不可删除'}, status=status.HTTP_400_BAD_REQUEST)
        return super().destroy(request, *args, **kwargs)

    del_ids = openapi.Schema(type=openapi.TYPE_OBJECT, required=['ids'], properties={
        'ids': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_INTEGER),
                              description="选择需要删除的ID（主键）列表")
        # TYPE_ARRAY是列表，items列表里的元素是整数类型
    })  # TYPE_OBJECT传参是json格式,required参数名字,properties规定每个参数的具体类型

    # action装饰器可以接收两个参数：methods:该action对应的请求方式
    # detail:声明该action是否与单一资源对应，是否是xxx/<pk>/方法名
    # True表示路径是xxx/<pk>/方法名
    # False表示路径是xxx/方法名
    @swagger_auto_schema(method='delete', request_body=del_ids,
                         operation_description="批量删除")  # 在接口注释,request_body传参,适用于接口文档,在文档中添加multiple_delete
    @action(methods=['delete'], detail=False)
    def multiple_delete(self, request, *args, **kwargs):
        delete_ids = request.data.get('ids')
        try:
            admin = RolesModel.objects.get(name='admin')
            if isinstance(delete_ids, list):
                if admin.id in delete_ids:
                    return Response(data={'detail': 'admin角色不可删除'}, status=status.HTTP_400_BAD_REQUEST)
        except RolesModel.DoesNotExist:
            pass

        RolesModel.objects.filter(id__in=delete_ids).delete()
        return Response(data={'message': '删除成功'}, status=status.HTTP_200_OK)




























